package edu.towson.cosc.cosc455.chad.markdowncompiler;
import edu.towson.cosc.cosc455.interfaces.LexicalAnalyzer;

import java.io.*;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.Queue;
import java.util.Scanner;

import java.util.*;
import edu.towson.cosc.cosc455.interfaces.LexicalAnalyzer;

public abstract class MyLexicalAnalyzer implements LexicalAnalyzer {
 private char char1 = '-'; 
 private HashSet<String> Token;
 private String[] array;
 
 public MyLexicalAnalyzer(){
  Token = new HashSet<String>();
  Token.add("#START DOCUMENT"); 
  Token.add("#END DOCUMENT");
  Token.add("#START HEAD"); 
  Token.add("#END HEAD");
  Token.add("#START TITLE"); 
  Token.add("#END TITLE");
  Token.add("#START PARAGRAPH"); 
  Token.add("#END PARAGRAPH");
  Token.add("#START BOLD"); 
  Token.add("#END BOLD");
  Token.add("#START ITALICS"); 
  Token.add("#END ITALICS");
  Token.add("#START LIST"); 
  Token.add("#END LIST");
  Token.add("#START ITEM"); 
  Token.add("#END ITEM");
  Token.add("#NEWLINE"); 
  Token.add("#START AUDIO"); 
  Token.add("#END AUDIO");
  Token.add("#START VIDEO"); 
  Token.add("#END VIDEO");
  Token.add("#START DEFINE"); 
  Token.add("#END DEFINE");
  Token.add("#VALUE"); 
  Token.add("#NAME"); 
  Token.add("#START USE"); 
  Token.add("#END USE");
  
  array = Token.toArray(new String[0]);
 }
 
 public void getNextToken() {
  char1 = getCharacter();
  while(isSpace(char1)){
   char1 = getCharacter();
  }
  
  if(char1 == '#'){  //tag
   addCharacter();
   char1 = getCharacter();
   while((!lookupToken()) && (char1 != '#')){
    addCharacter();
    if(!Compiler.text.isEmpty()){
     char1 = getCharacter();
    }
   }
  }
  else{  //text
   while((char1 != '#') && (Compiler.text.length() != 1)){
    addCharacter();
    char1 = getCharacter();
   }
  }
  
  if(!Compiler.text.isEmpty()){
   Compiler.text = char1 + Compiler.text;
  }
 }

 public char getCharacter() {
  //gets the next char
  char1 = Compiler.text.charAt(0);
  Compiler.text = Compiler.text.substring(1);
  return char1;
 }

 public void addCharacter() {
  //adds the char to the String
  Compiler.token = Compiler.token + char1; 
 }

 public boolean isSpace(char c) {
  boolean isSpace = false;
  if((c == ' ') || (c == '\t') || (c==' ')){
   isSpace = true;
  }
  return isSpace;
 }
 
 public boolean lookupToken() {
  //checks whether or not the token is valid
  boolean lookupToken = false;
  //hash set of valid tags
  for(int i = 0; i < array.length; i++){
   if(Compiler.token.equalsIgnoreCase(array[i])){
    lookupToken = true;
   }
  }
  return lookupToken;
 }


 
 public boolean isEmptySpace(String s){
  boolean isEmpty = true;
  for(int i = 0; i < s.length(); i++){
   if(!isSpace(s.charAt(i))){
    isEmpty = false;
   }
  }
  return isEmpty;
 }
 
 public boolean check(String someText){
	  boolean check = true;
	  if(someText.charAt(0) == '#'){
	   check = false;
	  }
	  return check;
	 }
 public void clearLexer(){
  Compiler.token = "";
  char1='-';
 }
}

